package cn.tedu.charging.order.controller;

import cn.tedu.charging.common.pojo.JsonResult;
import cn.tedu.charging.order.pojo.param.OrderAddParam;
import cn.tedu.charging.order.service.OrderService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
@RequestMapping("order")
@Api(tags = "订单模块")


public class OrderController {
    /**
     * Dto 数据传输对象 前端把数据传输到了后端的controller层  前端与后端之间传输
     * 服务器之间调用 A服务 调用 B服务  A服务和B服务都是后端   服务与服务之间传输
     *
     * Dto  服务与服务之间传输
     * Param 前端与后端之间传输
     *
     * 从功能上讲 用一个 O 来表示各层的传输对象是没有问题的
     * 为了解耦 每一层都独立处理 使用自己的O
     * 创建订单 OrderAddParam OrderCreateParam OrderSaveParam
     * 修改订单 OrderUpdateParam
     * 查询订单 OrderQueryParam  OrderQuery
     *
     * RESTFul 接口定义的一种规范 风格
     * 希望接口按照 HTTP的请求方式/方法 POST GET PUT DELETE
     * 来处理或者操作
     *
     * 资源 R resource
     *
     * 订单 就是 一种 资源
     * 用户 就是 一种 资源
     *
     * 处理 CRUD
     * C create 创建  HTTP POST 方法来 创建 资源    POST order/
     * R read   查询  HTTP GET 方法来 查询 资源     GET order/{orderNo}
     * U update 更新  HTTP PUT 方法来 更新 资源     PUT order/
     * D delete 删除  HTTP DELETE 方法来 删除 资源  DELETE order/{orderNo}
     *
     * 退化 或者 简化 只用 GET POST
     * 查询 GET
     * 增加 更新 删除 POST
     *
     * 接口如何定义
     *
     * 资源/动作
     * 动作/资源
     *
     * C create 创建  HTTP POST 方法来 创建 资源
     *  POST order/create  create/order
     *
     * R read   查询  HTTP GET 方法来 查询 资源
     *  GET order/info/{orderNo} 查询订单详情    /order/list 订单列表
     *  ET info/order/{orderNo} 查询订单详情    /list/order/ 订单列表
     *
     * U update 更新  HTTP POST 方法来 更新 资源
     *  POST order/update     update/order
     *
     * D delete 删除  HTTP POST 方法来 删除 资源
     *  POST order/delete/{orderNo}  delete/order/{orderNo}
     *
     * 驼峰命令
     * /createOrder/
     *
     *
     * 日志
     * 日志的目的
     * 是通过日志的方式来记录 程序运行的状态 正常状态和异常状态
     * 出现问题的时候通过日志 可以快速的定位问题
     *
     * @return
     */
    @Autowired
    private OrderService orderService;
    @ApiOperation("创建订单")
    @PostMapping("create")
    public JsonResult<String> createOrder(@RequestBody  OrderAddParam orderAddParam){
         log.debug("创建订单-入参:{}",orderAddParam);
        //创建类型的接口 是否要返回出参？要根据业务来决定
        //业务要求 用户创建订单后，跳转到订单详情页
        //创建订单接口的 出参 应该返回 订单号
        //订单号 可以 作为订单详情页的入参
        log.debug("创建订单-orderService:入参:{}", orderAddParam);
        String orderNo = orderService.createOrder(orderAddParam);
        log.debug("创建订单-orderService:入参:{},出参:{}", orderAddParam,orderNo);
        JsonResult<String> result = new JsonResult<>();
        result.setData(orderNo);
        result.setCode(2000);//2000 表示成功
        result.setMessage("创建订单成功");//一般在错误的时候返回错误信息
        /**
         *  code 2000 表示返回成功
         *  后端工程师和前端工程师基于接口文档编写代码 联调，测试工程师测试 功能
         * 测试工程师 创建订单失败了 然后 截个图 把问题 发到你们的测试群
         * 截图
         * 入参   userId = 123
         * 哪个接口 order/create
         * 结果/出参 弹框 创建订单失败
         *
         * 前端代码 if(code == 2000) {  alert(message); }
         * if(code != 2000) {  alert("message"); }
         *
         */
        log.debug("创建订单入参:{},出参:{}", orderAddParam, result);
        return  result;

    }
}
